# -*- coding: utf-8 -*-

"""
1.去重：
    写入数据库使用unique字段
    （布隆）过滤器直接过滤（推荐）

2.只要进入主目录就行了，不需要进入spider，就能在spider下创建自定爬虫文件
"""
import scrapy
from baidunews.items import BaidunewsItem #导入
from scrapy.http import Request
import re
import time

"""
首页能爬到一些，有些不能爬到→抓包分析，fiddler
数据的敏感性——widget
    网址不一定全在json类型的文件里面，（英文书名号）网页类型的文件里面也有！
&t=1575010304270——这就是一个时间戳
加载出来的不是json数据而是网页，观察网址——https://news.baidu.com/widget?id=LocalNews&ajax=json&t=1575009304436，缺了“&ajax=json”这一项
"""




class N1Spider(scrapy.Spider):
    name = 'n1'
    allowed_domains = ['baidu.com']
    start_urls = ['https://news.baidu.com/widget?id=LocalNews&ajax=json']
    all_id = ['LocalNews', 'civilnews', 'InternationalNews', 'EnterNews', 'SportNews', 'FinanceNews', 'TechNews', 'MilitaryNews', 'InternetNews', 'DiscoveryNews', 'LadyNews', 'HealthNews', 'PicWall']
    #构造地址
    all_url  = []
    for i in range(len(all_id)):
        # 构造当前的网址
        this_url = "https://news.baidu.com/widget?id=" + all_id[i] + "&ajax=json"
        all_url.append(this_url)


    #访问每个url
    def parse(self, response):
        #假如我们要5分钟采集一次
        while True:
            for j in range(len(self.all_url)):
                this_url = self.all_url[j]
                print("-------------------------------")
                print("当前爬取的栏目网址是：" + this_url)
                yield Request(this_url, callback = self.next)   #问题3：这里next后面多大了一个括号，导致只输出一个栏目

                """
                问题1：
                yield这一步不能少，而且start_urls 要改，否则不会执行print(url[k])
    
                问题2：
                yield outsider function!!!
                所以这里不要 yield Request(this_url,callback=self.pares)
                直接用Request去访问，并去掉回调函数的sef
                """
            time.sleep(300) #单位是秒

    # 得到每个栏目下的url
    #附加：集体缩进——shift+Tab
    def next(self,response):
        """
                print(self.all_id)
                #日志信息：2019-11-29 15:41:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://baidu.com/robots.txt> (referer: None)
                #settings里面修改信息，改位False
                """
        data = response.body.decode("utf-8", "ignore")  # 注意解码
        # LocalNews类网址下面的链接对应正则
        pat1 = '"url":"(.*?)"'
        # 其他类网址下面的链接对应正则
        pat2 = '"m_url":"(.*?)"'
        url1 = re.compile(pat1, re.S).findall(data)  # 注意匹配换行符
        url2 = re.compile(pat2, re.S).findall(data)
        if (len(url1) != 0):
            url = url1
        else:
            url = url2
        for k in range(len(url)):
            url[k] = re.sub('\\\/', '/', url[k])  # 斜杠是需要转义字符，才能转义本身的
            # 错：url[k] = re.sub('\\\/','\/',url[k]) ——多打了一个斜杠
            print(url[k])
            yield Request(url[k],callback=self.next1)

    def next1(self,response):
            item = BaidunewsItem()
            item["link"] = response.url #得到当前的url
            item["title"] = response.xpath("/html/head/title/text()").extract() #这里好像会出现异常——可以进行异常处理（老师出现了，但是我没与）
            item["content"]  = response.body.decode("utf-8", "ignore")
            yield item  #注意开启Pipeline

"""
问题4：出现有些网址是无法访问的（感觉也不是新闻的网址），正则匹配的时候出现了问题，后面需要解决
问题5：写入数据库+写入数据库时去重的方法
"""



